home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / DCLAP 6d / dclap6d / vibrant / vibsbars.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-05  |  32.4 KB  |  1,360 lines  |  [TEXT/R*ch]

  1. /*   vibsbars.c
  2. * ===========================================================================
  3. *
  4. *                            PUBLIC DOMAIN NOTICE
  5. *            National Center for Biotechnology Information (NCBI)
  6. *
  7. *  This software/database is a "United States Government Work" under the
  8. *  terms of the United States Copyright Act.  It was written as part of
  9. *  the author's official duties as a United States Government employee and
  10. *  thus cannot be copyrighted.  This software/database is freely available
  11. *  to the public for use. The National Library of Medicine and the U.S.
  12. *  Government do not place any restriction on its use or reproduction.
  13. *  We would, however, appreciate having the NCBI and the author cited in
  14. *  any work or product based on this material
  15. *
  16. *  Although all reasonable efforts have been taken to ensure the accuracy
  17. *  and reliability of the software and data, the NLM and the U.S.
  18. *  Government do not and cannot warrant the performance or results that
  19. *  may be obtained by using this software or data. The NLM and the U.S.
  20. *  Government disclaim all warranties, express or implied, including
  21. *  warranties of performance, merchantability or fitness for any particular
  22. *  purpose.
  23. *
  24. * ===========================================================================
  25. *
  26. * File Name:  vibsbars.c
  27. *
  28. * Author:  Jonathan Kans
  29. *
  30. * Version Creation Date:   7/1/91
  31. *
  32. * $Revision: 2.10 $
  33. *
  34. * File Description: 
  35. *       Vibrant scroll bar functions
  36. *
  37. * Modifications:  
  38. * --------------------------------------------------------------------------
  39. * Date     Name        Description of modification
  40. * -------  ----------  -----------------------------------------------------
  41. *
  42. *
  43. * ==========================================================================
  44. */
  45.  
  46. #include <vibtypes.h>
  47. #include <vibprocs.h>
  48. #include <vibincld.h>
  49.  
  50. /* Note that the scroll bar tool type is also duplicated in vibwndws.c */
  51.  
  52. #ifdef WIN_MAC
  53. #define Nlm_BarTool ControlHandle
  54. #endif
  55.  
  56. #ifdef WIN_MSWIN
  57. #define Nlm_BarTool HWND
  58. #endif
  59.  
  60. #ifdef WIN_MOTIF
  61. #define Nlm_BarTool Widget
  62. #endif
  63.  
  64. typedef  struct  Nlm_bardata {
  65.   Nlm_BarTool   handle;
  66.   Nlm_Int2      pageUp;
  67.   Nlm_Int2      pageDn;
  68.   Nlm_Int2      delta;
  69.   Nlm_Int2      value;
  70.   Nlm_Int2      maximum;
  71.   Nlm_Boolean   anomaly;
  72.   Nlm_GraphiC   slave;
  73.   Nlm_ScrlProc  action;
  74. } Nlm_BarData;
  75.  
  76. typedef  struct  Nlm_barrec {
  77.   Nlm_GraphicRec  graphicR;
  78.   Nlm_BarData     bar;
  79. } Nlm_BarRec, PNTR Nlm_BarPtr;
  80.  
  81. static Nlm_GphPrcsPtr  gphprcsptr = NULL;
  82.  
  83. static Nlm_GphPrcsPtr  barProcs;
  84. static Nlm_GphPrcsPtr  linkedBarProcs;
  85.  
  86. static Nlm_BaR         recentBar = NULL;
  87. static Nlm_BarData     recentBarData;
  88.  
  89. #ifdef WIN_MSWIN
  90. static WNDPROC         lpfnNewBarProc = NULL;
  91. static WNDPROC         lpfnOldBarProc = NULL;
  92. static Nlm_Boolean     handlechar;
  93. #endif
  94.  
  95. static void Nlm_LoadBarData (Nlm_BaR b, Nlm_BarTool hdl,
  96.                              Nlm_Int2 pgUp, Nlm_Int2 pgDn,
  97.                              Nlm_Int2 dlta, Nlm_Int2 val,
  98.                              Nlm_Int2 max, Nlm_Boolean anomaly,
  99.                              Nlm_GraphiC slv, Nlm_ScrlProc actn)
  100.  
  101. {
  102.   Nlm_BarPtr   bp;
  103.   Nlm_BarData  PNTR bdptr;
  104.  
  105.   if (b != NULL) {
  106.     bp = (Nlm_BarPtr) Nlm_HandLock (b);
  107.     bdptr = &(bp->bar);
  108.     bdptr->handle = hdl;
  109.     bdptr->pageUp = pgUp;
  110.     bdptr->pageDn = pgDn;
  111.     bdptr->delta = dlta;
  112.     bdptr->value = val;
  113.     bdptr->maximum = max;
  114.     bdptr->anomaly = anomaly;
  115.     bdptr->slave = slv;
  116.     bdptr->action = actn;
  117.     Nlm_HandUnlock (b);
  118.     recentBar = NULL;
  119.   }
  120. }
  121.  
  122. static void Nlm_SetBarData (Nlm_BaR b, Nlm_BarData * bdata)
  123.  
  124. {
  125.   Nlm_BarPtr  bp;
  126.  
  127.   if (b != NULL && bdata != NULL) {
  128.     bp = (Nlm_BarPtr) Nlm_HandLock (b);
  129.     bp->bar = *bdata;
  130.     Nlm_HandUnlock (b);
  131.     recentBar = b;
  132.     recentBarData = *bdata;
  133.   }
  134. }
  135.  
  136. static void Nlm_GetBarData (Nlm_BaR b, Nlm_BarData * bdata)
  137.  
  138. {
  139.   Nlm_BarPtr  bp;
  140.  
  141.   if (b != NULL && bdata != NULL) {
  142.     if (b == recentBar) {
  143.       *bdata = recentBarData;
  144.     } else {
  145.       bp = (Nlm_BarPtr) Nlm_HandLock (b);
  146.       *bdata = bp->bar;
  147.       Nlm_HandUnlock (b);
  148.       recentBar = b;
  149.       recentBarData = *bdata;
  150.     }
  151.   }
  152. }
  153.  
  154. static Nlm_BarTool Nlm_GetBarHandle (Nlm_BaR b)
  155.  
  156. {
  157.   Nlm_BarData  bdata;
  158.  
  159.   Nlm_GetBarData (b, &bdata);
  160.   return bdata.handle;
  161. }
  162.  
  163. static void Nlm_SetBarDelta (Nlm_BaR b, Nlm_Int2 dlt)
  164.  
  165. {
  166.   Nlm_BarData  bdata;
  167.  
  168.   Nlm_GetBarData (b, &bdata);
  169.   bdata.delta = dlt;
  170.   Nlm_SetBarData (b, &bdata);
  171. }
  172.  
  173. static Nlm_Int2 Nlm_GetBarMax (Nlm_BaR b)
  174.  
  175. {
  176.   Nlm_BarData  bdata;
  177.   Nlm_Int2     rsult;
  178.  
  179.   rsult = 0;
  180.   if (b != NULL) {
  181.     Nlm_GetBarData (b, &bdata);
  182.     rsult = bdata.maximum;
  183.   }
  184.   return rsult;
  185. }
  186.  
  187. static Nlm_Int2 Nlm_GetBarPageUp (Nlm_BaR b)
  188.  
  189. {
  190.   Nlm_BarData  bdata;
  191.   Nlm_Int2     rsult;
  192.  
  193.   rsult = 0;
  194.   if (b != NULL) {
  195.     Nlm_GetBarData (b, &bdata);
  196.     rsult = bdata.pageUp;
  197.   }
  198.   return rsult;
  199. }
  200.  
  201. static Nlm_Int2 Nlm_GetBarPageDown (Nlm_BaR b)
  202.  
  203. {
  204.   Nlm_BarData  bdata;
  205.   Nlm_Int2     rsult;
  206.  
  207.   rsult = 0;
  208.   if (b != NULL) {
  209.     Nlm_GetBarData (b, &bdata);
  210.     rsult = bdata.pageDn;
  211.   }
  212.   return rsult;
  213. }
  214.  
  215. static void Nlm_DoScrollAction (Nlm_BaR b)
  216.  
  217. {
  218.   Nlm_ScrlProc  actn;
  219.   Nlm_BarData   bdata;
  220.  
  221.   Nlm_GetBarData (b, &bdata);
  222.   actn = bdata.action;
  223.   if (actn != NULL) {
  224.     actn (b, bdata.slave, bdata.value, bdata.delta + bdata.value);
  225.   }
  226. }
  227.  
  228. #ifdef WIN_MAC
  229. pascal void ScrollAction PROTO((Nlm_BarTool c, Nlm_Int2 part));
  230. pascal void ScrollAction (Nlm_BarTool c, Nlm_Int2 part)
  231.  
  232. {
  233.   Nlm_BaR   b;
  234.   Nlm_Int2  max;
  235.   Nlm_Int2  newval;
  236.   Nlm_Int2  oldval;
  237.   Nlm_Int2  pageUp;
  238.   Nlm_Int2  pageDn;
  239.   Nlm_Int4  ref;
  240.  
  241.   ref = GetCRefCon (c);
  242.   b = (Nlm_BaR) ref;
  243.   oldval = Nlm_DoGetValue ((Nlm_GraphiC) b);
  244.   max = Nlm_GetBarMax (b);
  245.   pageUp = Nlm_GetBarPageUp (b);
  246.   pageDn = Nlm_GetBarPageDown (b);
  247.   switch (part) {
  248.     case inUpButton:
  249.       if (oldval > 0) {
  250.         newval = oldval - 1;
  251.         Nlm_DoSetValue ((Nlm_GraphiC) b, newval, TRUE);
  252.       } else {
  253.         Nlm_DoSetValue ((Nlm_GraphiC) b, 0, TRUE);
  254.       }
  255.       break;
  256.     case inDownButton:
  257.       if (oldval < max) {
  258.         newval = oldval + 1;
  259.         Nlm_DoSetValue ((Nlm_GraphiC) b, newval, TRUE);
  260.       } else {
  261.         Nlm_DoSetValue ((Nlm_GraphiC) b, max, TRUE);
  262.       }
  263.       break;
  264.     case inPageUp:
  265.       if (oldval > pageUp) {
  266.         newval = oldval - pageUp;
  267.       } else {
  268.         newval = 0;
  269.       }
  270.       Nlm_DoSetValue ((Nlm_GraphiC) b, newval, TRUE);
  271.       break;
  272.     case inPageDown:
  273.       if (oldval + pageDn < max) {
  274.         newval = oldval + pageDn;
  275.       } else {
  276.         newval = max;
  277.       }
  278.       Nlm_DoSetValue ((Nlm_GraphiC) b, newval, TRUE);
  279.       break;
  280.     default:
  281.       break;
  282.   }
  283. }
  284.  
  285. static Nlm_Boolean Nlm_ScrollClick (Nlm_GraphiC b, Nlm_PoinT pt)
  286.  
  287. {
  288.   Nlm_BarData    bdata;
  289.   Nlm_BarTool    c;
  290.   Nlm_Int2       newval;
  291.   Nlm_Int2       oldval;
  292.   Nlm_Int2       part;
  293.   ProcPtr        proc;
  294.   Nlm_PointTool  ptool;
  295.   Nlm_RecT       r;
  296.   Nlm_Boolean    rsult;
  297.   pascal void    (*sp) PROTO((Nlm_BarTool, Nlm_Int2));
  298.  
  299.   rsult = FALSE;
  300.   Nlm_GetRect (b, &r);
  301.   if ((Nlm_PtInRect (pt, &r))) {
  302.     c = Nlm_GetBarHandle ((Nlm_BaR) b);
  303.     oldval = GetCtlValue (c);
  304.     Nlm_PoinTToPointTool (pt, &ptool);
  305.     part = TestControl (c, ptool);
  306.     if (part == inThumb) {
  307.       part = TrackControl (c, ptool, NULL);
  308.       newval = GetCtlValue (c);
  309.       Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  310.       bdata.value = newval;
  311.       bdata.delta = oldval - newval;
  312.       Nlm_SetBarData ((Nlm_BaR) b, &bdata);
  313.       if (oldval != newval) {
  314.         Nlm_DoScrollAction ((Nlm_BaR) b);
  315.       }
  316.     } else {
  317.       sp = ScrollAction;
  318.       proc = (ProcPtr) sp;
  319. #if  defined(powerc) || defined(__powerc)  || defined(COMP_CODEWAR)
  320.       {  
  321.       ControlActionUPP caupp= NewControlActionProc( proc);
  322.       part = TrackControl (c, ptool, caupp);
  323.       }
  324. #else
  325.       part = TrackControl (c, ptool, proc);
  326. #endif
  327.     }
  328.     rsult = TRUE;
  329.   }
  330.   return rsult;
  331. }
  332. #endif
  333.  
  334. #ifdef WIN_MSWIN
  335.  
  336. static Nlm_Boolean Nlm_ScrollCommand (Nlm_GraphiC b)
  337.  
  338. {
  339.   Nlm_Int2  max;
  340.   Nlm_Int2  newval;
  341.   Nlm_Int2  oldval;
  342.   Nlm_Int2  pageUp;
  343.   Nlm_Int2  pageDn;
  344.  
  345.   oldval = Nlm_DoGetValue (b);
  346.   max = Nlm_GetBarMax ((Nlm_BaR) b);
  347.   pageUp = Nlm_GetBarPageUp ((Nlm_BaR) b);
  348.   pageDn = Nlm_GetBarPageDown ((Nlm_BaR) b);
  349.   switch (Nlm_currentCode) {
  350.     case SB_LINEUP:
  351.       if (oldval > 0) {
  352.         newval = oldval - 1;
  353.         Nlm_DoSetValue (b, newval, TRUE);
  354.       } else {
  355.         Nlm_DoSetValue (b, 0, TRUE);
  356.       }
  357.       break;
  358.     case SB_LINEDOWN:
  359.       if (oldval < max) {
  360.         newval = oldval + 1;
  361.         Nlm_DoSetValue (b, newval, TRUE);
  362.       } else {
  363.         Nlm_DoSetValue (b, max, TRUE);
  364.       }
  365.       break;
  366.     case SB_PAGEUP:
  367.       if (oldval > pageUp) {
  368.         newval = oldval - pageUp;
  369.       } else {
  370.         newval = 0;
  371.       }
  372.       Nlm_DoSetValue (b, newval, TRUE);
  373.       break;
  374.     case SB_PAGEDOWN:
  375.       if (oldval + pageDn < max) {
  376.         newval = oldval + pageDn;
  377.       } else {
  378.         newval = max;
  379.       }
  380.       Nlm_DoSetValue (b, newval, TRUE);
  381.       break;
  382.     case SB_THUMBPOSITION:
  383.       newval = Nlm_currentPos;
  384.       Nlm_DoSetValue (b, newval, TRUE);
  385.       break;
  386.     default:
  387.       break;
  388.   }
  389.   return FALSE;
  390. }
  391. #endif
  392.  
  393. #ifdef WIN_MOTIF
  394. #endif
  395.  
  396. #ifdef WIN_MAC
  397. static void Nlm_DrawBar (Nlm_GraphiC b)
  398.  
  399. {
  400.   Nlm_BarData  bdata;
  401.   Nlm_BarTool  c;
  402.   Nlm_RecT     r;
  403.  
  404.   if (Nlm_GetVisible (b) && Nlm_GetAllParentsVisible (b)) {
  405.     Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  406.     Nlm_GetRect (b, &r);
  407.     if (Nlm_RectInRgn (&r, Nlm_updateRgn)) {
  408.       c = bdata.handle;
  409.       if (bdata.maximum != GetCtlMax (c)) {
  410.         SetCtlMax (c, bdata.maximum);
  411.       }
  412.       if (bdata.value != GetCtlValue (c)) {
  413.         SetCtlValue (c, bdata.value);
  414.       }
  415.       Draw1Control (c);
  416.     }
  417.   }
  418. }
  419. #endif
  420.  
  421. static void Nlm_ShowBar (Nlm_GraphiC b, Nlm_Boolean setFlag, Nlm_Boolean savePort)
  422.  
  423. {
  424.   Nlm_BarTool  c;
  425.   Nlm_WindoW   tempPort;
  426.  
  427.   if (setFlag) {
  428.     Nlm_SetVisible (b, TRUE);
  429.   }
  430.   if (Nlm_GetVisible (b) && Nlm_AllParentsButWindowVisible (b)) {
  431.     tempPort = Nlm_SavePortIfNeeded (b, savePort);
  432.     c = Nlm_GetBarHandle ((Nlm_BaR) b);
  433. #ifdef WIN_MAC
  434.     ShowControl (c);
  435.     Nlm_DoDraw (b);
  436. #endif
  437. #ifdef WIN_MSWIN
  438.     ShowWindow (c, SW_SHOW);
  439.     UpdateWindow (c);
  440. #endif
  441. #ifdef WIN_MOTIF
  442.     XtManageChild (c);
  443. #endif
  444.     Nlm_RestorePort (tempPort);
  445.   }
  446. }
  447.  
  448. static void Nlm_HideBar (Nlm_GraphiC b, Nlm_Boolean setFlag, Nlm_Boolean savePort)
  449.  
  450. {
  451.   Nlm_BarTool  c;
  452.   Nlm_WindoW   tempPort;
  453. #ifdef WIN_MAC
  454.   Nlm_RecT     r;
  455. #endif
  456.  
  457.   if (setFlag) {
  458.     Nlm_SetVisible (b, FALSE);
  459.   }
  460.   tempPort = Nlm_SavePortIfNeeded (b, savePort);
  461.   c = Nlm_GetBarHandle ((Nlm_BaR) b);
  462. #ifdef WIN_MAC
  463.   HideControl (c);
  464.   if (Nlm_GetAllParentsVisible (b)) {
  465.     Nlm_GetRect (b, &r);
  466.     Nlm_InsetRect (&r, -1, -1);
  467.     Nlm_EraseRect (&r);
  468.     Nlm_ValidRect (&r);
  469.   }
  470. #endif
  471. #ifdef WIN_MSWIN
  472.   ShowWindow (c, SW_HIDE);
  473.   UpdateWindow (c);
  474. #endif
  475. #ifdef WIN_MOTIF
  476.   XtUnmanageChild (c);
  477. #endif
  478.   Nlm_RestorePort (tempPort);
  479. }
  480.  
  481. static void Nlm_EnableBar (Nlm_GraphiC b, Nlm_Boolean setFlag, Nlm_Boolean savePort)
  482.  
  483. {
  484.   Nlm_BarData  bdata;
  485.   Nlm_BarTool  c;
  486.   Nlm_WindoW   tempPort;
  487. #ifdef WIN_MSWIN
  488.   int          maximum;
  489.   int          minimum;
  490. #endif
  491. #ifdef WIN_MOTIF
  492.   int          maximum;
  493.   int          value;
  494.   Cardinal     n;
  495.   Arg          wargs [10];
  496. #endif
  497.  
  498.   if (setFlag) {
  499.     Nlm_SetEnabled (b, TRUE);
  500.   }
  501.   if (Nlm_GetEnabled (b) && Nlm_GetAllParentsEnabled (b)) {
  502.     tempPort = Nlm_SavePortIfNeeded (b, savePort);
  503.     Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  504.     c = bdata.handle;
  505. #ifdef WIN_MAC
  506.     if (bdata.maximum != GetCtlMax (c)) {
  507.       SetCtlMax (c, bdata.maximum);
  508.     }
  509.     if (bdata.value != GetCtlValue (c)) {
  510.       SetCtlValue (c, bdata.value);
  511.     }
  512.     HiliteControl (c, 0);
  513. #endif
  514. #ifdef WIN_MSWIN
  515.     EnableWindow (c, TRUE);
  516.     GetScrollRange (c, SB_CTL, &minimum, &maximum);
  517.     if (bdata.maximum != (Nlm_Int2) maximum) {
  518.       SetScrollRange (c, SB_CTL, 0, bdata.maximum, TRUE);
  519.     }
  520.     if (bdata.value != GetScrollPos (c, SB_CTL)) {
  521.       SetScrollPos (c, SB_CTL, bdata.value, TRUE);
  522.     }
  523. #endif
  524. #ifdef WIN_MOTIF
  525.     XtVaGetValues (c, XmNmaximum, &maximum, XmNvalue, &value, NULL);
  526.     n = 0;
  527.     if (bdata.maximum != maximum) {
  528.       XtSetArg (wargs [n], XmNmaximum, (int) (bdata.maximum + 20)); n++;
  529.     }
  530.     if (bdata.value != value) {
  531.       XtSetArg (wargs [n], XmNvalue, (int) bdata.value); n++;
  532.     }
  533.     XtSetArg (wargs [n], XmNsensitive, TRUE); n++;
  534.     XtSetValues (c, wargs, n);
  535. #endif
  536.     Nlm_RestorePort (tempPort);
  537.   }
  538. }
  539.  
  540. static void Nlm_DisableBar (Nlm_GraphiC b, Nlm_Boolean setFlag, Nlm_Boolean savePort)
  541.  
  542. {
  543.   Nlm_BarTool  c;
  544.   Nlm_WindoW   tempPort;
  545.  
  546.   if (setFlag) {
  547.     Nlm_SetEnabled (b, FALSE);
  548.   }
  549.   tempPort = Nlm_SavePortIfNeeded (b, savePort);
  550.   c = Nlm_GetBarHandle ((Nlm_BaR) b);
  551. #ifdef WIN_MAC
  552.   HiliteControl (c, 255);
  553. #endif
  554. #ifdef WIN_MSWIN
  555.   EnableWindow (c, FALSE);
  556. #endif
  557. #ifdef WIN_MOTIF
  558.   XtVaSetValues (c, XmNsensitive, FALSE, NULL);
  559. #endif
  560.   Nlm_RestorePort (tempPort);
  561. }
  562.  
  563. static void Nlm_ResetBar (Nlm_GraphiC b, Nlm_Boolean savePort)
  564.  
  565. {
  566.   Nlm_BarData  bdata;
  567.   Nlm_BarTool  c;
  568.   Nlm_WindoW   tempPort;
  569. #ifdef WIN_MOTIF
  570.   Cardinal     n;
  571.   Arg          wargs [10];
  572. #endif
  573.  
  574.   tempPort = Nlm_SavePortIfNeeded (b, savePort);
  575.   Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  576.   bdata.pageUp = 0;
  577.   bdata.pageDn = 0;
  578.   bdata.delta = 0;
  579.   bdata.value = 0;
  580.   bdata.maximum = 0;
  581.   Nlm_SetBarData ((Nlm_BaR) b, &bdata);
  582.   c = bdata.handle;
  583.   if (Nlm_GetEnabled (b)) {
  584. #ifdef WIN_MAC
  585.     SetCtlValue (c, 0);
  586.     SetCtlMax (c, 0);
  587. #endif
  588. #ifdef WIN_MSWIN
  589.     SetScrollRange (c, SB_CTL, 0, 0, FALSE);
  590.     SetScrollPos (c, SB_CTL, 0, TRUE);
  591. #endif
  592. #ifdef WIN_MOTIF
  593.     n = 0;
  594.     XtSetArg (wargs [n], XmNminimum, 0); n++;
  595.     XtSetArg (wargs [n], XmNmaximum, 20); n++;
  596.     XtSetArg (wargs [n], XmNincrement, 1); n++;
  597.     XtSetArg (wargs [n], XmNpageIncrement, 1); n++;
  598.     XtSetArg (wargs [n], XmNvalue, 0); n++;
  599.     XtSetValues (c, wargs, n);
  600. #endif
  601. }
  602.   Nlm_RestorePort (tempPort);
  603. }
  604.  
  605. static void Nlm_RemoveBar (Nlm_GraphiC b, Nlm_Boolean savePort)
  606.  
  607. {
  608.   Nlm_BarTool  c;
  609.   Nlm_WindoW   tempPort;
  610.  
  611.   tempPort = Nlm_SavePortIfNeeded (b, savePort);
  612.   c = Nlm_GetBarHandle ((Nlm_BaR) b);
  613. #ifdef WIN_MAC
  614.   DisposeControl (c);
  615. #endif
  616. #ifdef WIN_MSWIN
  617.   RemoveProp (c, (LPSTR) "Nlm_VibrantProp");
  618.   DestroyWindow (c);
  619. #endif
  620. #ifdef WIN_MOTIF
  621.   XtDestroyWidget (c);
  622. #endif
  623.   Nlm_HandFree (b);
  624.   recentBar = NULL;
  625.   Nlm_RestorePort (tempPort);
  626. }
  627.  
  628. static void Nlm_RemoveLinkedInBar (Nlm_GraphiC b, Nlm_Boolean savePort)
  629.  
  630. {
  631.   Nlm_BarTool  c;
  632.   Nlm_WindoW   tempPort;
  633.  
  634.   tempPort = Nlm_SavePortIfNeeded (b, savePort);
  635.   c = Nlm_GetBarHandle ((Nlm_BaR) b);
  636. #ifdef WIN_MAC
  637.   DisposeControl (c);
  638. #endif
  639. #ifdef WIN_MSWIN
  640.   RemoveProp (c, (LPSTR) "Nlm_VibrantProp");
  641.   DestroyWindow (c);
  642. #endif
  643. #ifdef WIN_MOTIF
  644.   XtDestroyWidget (c);
  645. #endif
  646.   Nlm_RemoveLink (b);
  647.   recentBar = NULL;
  648.   Nlm_RestorePort (tempPort);
  649. }
  650.  
  651. static void Nlm_SetBarValue (Nlm_GraphiC b, Nlm_Int2 val, Nlm_Boolean savePort)
  652.  
  653. {
  654.   Nlm_BarData  bdata;
  655.   Nlm_BarTool  c;
  656.   Nlm_Int2     oldval;
  657.   Nlm_WindoW   tempPort;
  658. #ifdef WIN_MOTIF
  659.   Nlm_Int2     page;
  660. #endif
  661.  
  662.   if (b != NULL) {
  663.     Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  664.     if (val < 0) {
  665.       val = 0;
  666.     }
  667.     if (val > bdata.maximum) {
  668.       val = bdata.maximum;
  669.     }
  670.     c = bdata.handle;
  671.     oldval = bdata.value;
  672.     bdata.value = val;
  673.     bdata.delta = oldval - val;
  674.     Nlm_SetBarData ((Nlm_BaR) b, &bdata);
  675.     if (val != oldval && Nlm_GetEnabled (b)) {
  676.       tempPort = Nlm_SavePortIfNeeded (b, savePort);
  677. #ifdef WIN_MAC
  678.       SetCtlValue (c, val);
  679. #endif
  680. #ifdef WIN_MSWIN
  681.       SetScrollPos (c, SB_CTL, val, TRUE);
  682. #endif
  683. #ifdef WIN_MOTIF
  684.       page = (bdata.pageUp + bdata.pageDn) / 2;
  685.       XmScrollBarSetValues (c, (int) val, 20, 1, (int) page, FALSE);
  686. #endif
  687.       Nlm_DoScrollAction ((Nlm_BaR) b);
  688.       Nlm_RestorePort (tempPort);
  689.     }
  690.   }
  691. }
  692.  
  693. static Nlm_Int2 Nlm_GetBarValue (Nlm_GraphiC b)
  694.  
  695. {
  696.   Nlm_BarData  bdata;
  697.   Nlm_Int2     rsult;
  698.  
  699.   rsult = 0;
  700.   if (b != NULL) {
  701.     Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  702.     rsult = bdata.value;
  703.   }
  704.   return rsult;
  705. }
  706.  
  707. static void Nlm_InvalBar (Nlm_GraphiC b)
  708.  
  709. {
  710.   Nlm_RecT  r;
  711.  
  712.   if (Nlm_GetVisible (b) && Nlm_GetAllParentsVisible (b)) {
  713.     Nlm_GetRect (b, &r);
  714.     Nlm_InsetRect (&r, -1, -1);
  715.     Nlm_InvalRect (&r);
  716.   }
  717. }
  718.  
  719. static void Nlm_SetBarPosition (Nlm_GraphiC b, Nlm_RectPtr r, Nlm_Boolean savePort)
  720.  
  721. {
  722.   Nlm_BarTool  c;
  723.   Nlm_WindoW   tempPort;
  724.  
  725.   if (r != NULL) {
  726.     tempPort = Nlm_SavePortIfNeeded (b, savePort);
  727.     c = Nlm_GetBarHandle ((Nlm_BaR) b);
  728. #ifdef WIN_MAC
  729.     Nlm_InvalBar (b);
  730.     MoveControl (c, r->left, r->top);
  731.     SizeControl (c, r->right - r->left, r->bottom - r->top);
  732.     Nlm_SetRect (b, r);
  733.     Nlm_InvalBar (b);
  734. #endif
  735. #ifdef WIN_MSWIN
  736.     Nlm_SetRect (b, r);
  737.     MoveWindow (c, r->left, r->top, r->right - r->left, r->bottom - r->top, TRUE);
  738.     UpdateWindow (c);
  739. #endif
  740. #ifdef WIN_MOTIF
  741.       XtVaSetValues (c,
  742.                      XmNx, (Position) r->left,
  743.                      XmNy, (Position) r->top,
  744.                      XmNwidth, (Dimension) (r->right - r->left),
  745.                      XmNheight, (Dimension) (r->bottom - r->top), 
  746.                      NULL);
  747.     Nlm_SetRect (b, r);
  748. #endif
  749.     Nlm_RestorePort (tempPort);
  750.   }
  751. }
  752.  
  753. static void Nlm_GetBarPosition (Nlm_GraphiC b, Nlm_RectPtr r)
  754.  
  755. {
  756.   if (r != NULL) {
  757.     Nlm_GetRect (b, r);
  758.   }
  759. }
  760.  
  761. static void Nlm_SetBarRange (Nlm_GraphiC b, Nlm_Int2 pgUp,
  762.                              Nlm_Int2 pgDn, Nlm_Int2 xmax,
  763.                              Nlm_Boolean savePort)
  764.  
  765. {
  766.   Nlm_BarData  bdata;
  767.   Nlm_BarTool  c;
  768.   Nlm_Boolean  changed;
  769.   Nlm_WindoW   tempPort;
  770. #ifdef WIN_MOTIF
  771.   Cardinal     n;
  772.   Arg          wargs [10];
  773. #endif
  774.  
  775.   if (b != NULL) {
  776.     Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  777.     if (bdata.pageUp != pgUp || bdata.pageDn != pgDn || bdata.maximum != xmax) {
  778.       changed = FALSE;
  779.       if (pgUp > 0) {
  780.         bdata.pageUp = pgUp;
  781.         changed = TRUE;
  782.       }
  783.       if (pgDn > 0) {
  784.         bdata.pageDn = pgDn;
  785.         changed = TRUE;
  786.       }
  787.       if (xmax > 0) {
  788.         bdata.maximum = xmax;
  789.         changed = TRUE;
  790.       }
  791.       if (changed) {
  792.         Nlm_SetBarData ((Nlm_BaR) b, &bdata);
  793.       }
  794.       if (changed && xmax > 0 && Nlm_GetEnabled (b)) {
  795.         tempPort = Nlm_SavePortIfNeeded (b, savePort);
  796.         c = bdata.handle;
  797. #ifdef WIN_MAC
  798.         SetCtlMax (c, xmax);
  799. #endif
  800. #ifdef WIN_MSWIN
  801.         SetScrollRange (c, SB_CTL, 0, xmax, TRUE);
  802. #endif
  803. #ifdef WIN_MOTIF
  804.         n = 0;
  805.         XtSetArg (wargs [n], XmNminimum, 0); n++;
  806.         XtSetArg (wargs [n], XmNmaximum, (int) xmax + 20); n++;
  807.         XtSetValues (c, wargs, n);
  808. #endif
  809.         Nlm_RestorePort (tempPort);
  810.       }
  811.     }
  812.   }
  813. }
  814.  
  815. #ifdef WIN_MSWIN
  816. /* Message cracker functions */
  817.  
  818. static void MyCls_OnChar (HWND hwnd, UINT ch, int cRepeat)
  819.  
  820. {
  821.   Nlm_BaR  b;
  822.  
  823.   b = (Nlm_BaR) GetProp (hwnd, (LPSTR) "Nlm_VibrantProp");
  824.   handlechar = FALSE;
  825.   if (ch == '\t') {
  826.     Nlm_DoSendFocus ((Nlm_GraphiC) b, (Nlm_Char) ch);
  827.   } else if (ch == '\n' || ch == '\r') {
  828.     Nlm_DoSendFocus ((Nlm_GraphiC) b, (Nlm_Char) ch);
  829.   } else {
  830.     handlechar = TRUE;
  831.   }
  832. }
  833.  
  834. LRESULT CALLBACK EXPORT BarProc (HWND hwnd, UINT message,
  835.                                  WPARAM wParam, LPARAM lParam)
  836.  
  837. {
  838.   Nlm_BaR  b;
  839.   LRESULT  rsult;
  840.   HDC      tempHDC;
  841.   HWND     tempHWnd;
  842.  
  843.   if (Nlm_VibrantDisabled ()) {
  844.     return CallWindowProc (lpfnOldBarProc, hwnd, message, wParam, lParam);
  845.   }
  846.  
  847.   rsult = 0;
  848.   tempHWnd = Nlm_currentHWnd;
  849.   tempHDC = Nlm_currentHDC;
  850.   b = (Nlm_BaR) GetProp (hwnd, (LPSTR) "Nlm_VibrantProp");
  851.   Nlm_theWindow = Nlm_GetParentWindow ((Nlm_GraphiC) b);
  852.   Nlm_currentHWnd = GetParent (hwnd);
  853.   Nlm_currentHDC = Nlm_ParentWindowPort ((Nlm_GraphiC) b);
  854.   Nlm_currentWindowTool = hwnd;
  855.   Nlm_currentKey = '\0';
  856.   Nlm_currentWParam = wParam;
  857.   Nlm_currentLParam = lParam;
  858.   Nlm_cmmdKey = FALSE;
  859.   Nlm_ctrlKey = FALSE;
  860.   Nlm_optKey = FALSE;
  861.   Nlm_shftKey = FALSE;
  862.   Nlm_dblClick = FALSE;
  863.  
  864.   switch (message) {
  865.     case WM_CHAR:
  866.       HANDLE_WM_CHAR (hwnd, wParam, lParam, MyCls_OnChar);
  867.       if (handlechar) {
  868.         rsult = CallWindowProc (lpfnOldBarProc, hwnd, message, wParam, lParam);
  869.       }
  870.       break;
  871.     default:
  872.       rsult = CallWindowProc (lpfnOldBarProc, hwnd, message, wParam, lParam);
  873.       break;
  874.   }
  875.   Nlm_currentHWnd = tempHWnd;
  876.   Nlm_currentHDC = tempHDC;
  877.   Nlm_currentWindowTool = tempHWnd;
  878.   return rsult;
  879. }
  880. #endif
  881.  
  882. #ifdef WIN_MOTIF
  883. #define SCROLL_LINEUP 1
  884. #define SCROLL_LINEDN 2
  885. #define SCROLL_PAGEUP 3
  886. #define SCROLL_PAGEDN 4
  887. #define SCROLL_THUMB  5
  888.  
  889. static void Nlm_ScrollClick (Nlm_GraphiC b, Nlm_Int2 type, Nlm_Int2 thumb)
  890.  
  891. {
  892.   Nlm_BarData  bdata;
  893.   Nlm_BarTool  c;
  894.   Nlm_Int2     max;
  895.   Nlm_Int2     newval;
  896.   Nlm_Int2     oldval;
  897.   Nlm_Int2     page;
  898.   Nlm_Int2     pageUp;
  899.   Nlm_Int2     pageDn;
  900.  
  901.   Nlm_GetBarData ((Nlm_BaR) b, &bdata);
  902.   c = bdata.handle;
  903.   oldval = bdata.value;
  904.   max = bdata.maximum;
  905.   pageUp = bdata.pageUp;
  906.   pageDn = bdata.pageDn;
  907.   switch (type) {
  908.     case SCROLL_LINEUP:
  909.       if (oldval > 0) {
  910.         newval = oldval - 1;
  911.       } else {
  912.         newval = 0;
  913.       }
  914.       break;
  915.     case SCROLL_LINEDN:
  916.       if (oldval < max) {
  917.         newval = oldval + 1;
  918.       } else {
  919.         newval = max;
  920.       }
  921.       break;
  922.     case SCROLL_PAGEUP:
  923.       if (oldval > pageUp) {
  924.         newval = oldval - pageUp;
  925.       } else {
  926.         newval = 0;
  927.       }
  928.       break;
  929.     case SCROLL_PAGEDN:
  930.       if (oldval + pageDn < max) {
  931.         newval = oldval + pageDn;
  932.       } else {
  933.         newval = max;
  934.       }
  935.       break;
  936.     case SCROLL_THUMB:
  937.       newval = thumb;
  938.       break;
  939.     default:
  940.       break;
  941.   }
  942.   bdata.value = newval;
  943.   bdata.delta = oldval - newval;
  944.   Nlm_SetBarData ((Nlm_BaR) b, &bdata);
  945.   if (thumb != newval) {
  946.     page = (pageUp + pageDn) / 2;
  947.     XmScrollBarSetValues (c, (int) newval, 20, 1, (int) page, FALSE);
  948.   }
  949.   if (oldval != newval) {
  950.     Nlm_DoScrollAction ((Nlm_BaR) b);
  951.   }
  952. }
  953.  
  954. static void Nlm_LineUpCallback (Widget w, XtPointer client_data, XtPointer call_data)
  955.  
  956. {
  957.   Nlm_GraphiC                b;
  958.   XmScrollBarCallbackStruct  *cbs;
  959.   Nlm_Int2                   thumb;
  960.  
  961.   cbs = (XmScrollBarCallbackStruct *) call_data;
  962.   b = (Nlm_GraphiC) client_data;
  963.   thumb = (Nlm_Int2) cbs->value;
  964.   Nlm_ScrollClick (b, SCROLL_LINEUP, thumb);
  965. }
  966.  
  967. static void Nlm_LineDnCallback (Widget w, XtPointer client_data, XtPointer call_data)
  968.  
  969. {
  970.   Nlm_GraphiC                b;
  971.   XmScrollBarCallbackStruct  *cbs;
  972.   Nlm_Int2                   thumb;
  973.  
  974.   cbs = (XmScrollBarCallbackStruct *) call_data;
  975.   b = (Nlm_GraphiC) client_data;
  976.   thumb = (Nlm_Int2) cbs->value;
  977.   Nlm_ScrollClick (b, SCROLL_LINEDN, thumb);
  978. }
  979.  
  980. static void Nlm_PageUpCallback (Widget w, XtPointer client_data, XtPointer call_data)
  981.  
  982. {
  983.   Nlm_GraphiC                b;
  984.   XmScrollBarCallbackStruct  *cbs;
  985.   Nlm_Int2                   thumb;
  986.  
  987.   cbs = (XmScrollBarCallbackStruct *) call_data;
  988.   b = (Nlm_GraphiC) client_data;
  989.   thumb = (Nlm_Int2) cbs->value;
  990.   Nlm_ScrollClick (b, SCROLL_PAGEUP, thumb);
  991. }
  992.  
  993. static void Nlm_PageDnCallback (Widget w, XtPointer client_data, XtPointer call_data)
  994.  
  995. {
  996.   Nlm_GraphiC                b;
  997.   XmScrollBarCallbackStruct  *cbs;
  998.   Nlm_Int2                   thumb;
  999.  
  1000.   cbs = (XmScrollBarCallbackStruct *) call_data;
  1001.   b = (Nlm_GraphiC) client_data;
  1002.   thumb = (Nlm_Int2) cbs->value;
  1003.   Nlm_ScrollClick (b, SCROLL_PAGEDN, thumb);
  1004. }
  1005.  
  1006. static void Nlm_ThumbCallback (Widget w, XtPointer client_data, XtPointer call_data)
  1007.  
  1008. {
  1009.   Nlm_GraphiC                b;
  1010.   XmScrollBarCallbackStruct  *cbs;
  1011.   Nlm_Int2                   thumb;
  1012.  
  1013.   cbs = (XmScrollBarCallbackStruct *) call_data;
  1014.   b = (Nlm_GraphiC) client_data;
  1015.   thumb = (Nlm_Int2) cbs->value;
  1016.   Nlm_ScrollClick (b, SCROLL_THUMB, thumb);
  1017. }
  1018.  
  1019. static void Nlm_TopCallback (Widget w, XtPointer client_data, XtPointer call_data)
  1020.  
  1021. {
  1022.   Nlm_GraphiC  b;
  1023.  
  1024.   b = (Nlm_GraphiC) client_data;
  1025.   Nlm_ScrollClick (b, SCROLL_THUMB, 0);
  1026. }
  1027.  
  1028. static void Nlm_BottomCallback (Widget w, XtPointer client_data, XtPointer call_data)
  1029.  
  1030. {
  1031.   Nlm_GraphiC  b;
  1032.   Nlm_Int2     max;
  1033.  
  1034.   b = (Nlm_GraphiC) client_data;
  1035.   max = Nlm_GetBarMax ((Nlm_BaR) b);
  1036.   Nlm_ScrollClick (b, SCROLL_THUMB, max);
  1037. }
  1038. #endif
  1039.  
  1040. static void Nlm_NewBar (Nlm_BaR b, Nlm_GraphiC slv,
  1041.                         Nlm_Boolean vert, Nlm_ScrlProc actn)
  1042.  
  1043. {
  1044.   Nlm_BarTool     c;
  1045.   Nlm_RecT        r;
  1046.   Nlm_Int4        style;
  1047.   Nlm_WindowTool  wptr;
  1048. #ifdef WIN_MAC
  1049.   Nlm_Int4        ref;
  1050.   Nlm_RectTool    rtool;
  1051. #endif
  1052. #ifdef WIN_MOTIF
  1053.   Cardinal        n;
  1054.   Arg             wargs [20];
  1055. #endif
  1056.  
  1057.   Nlm_GetRect ((Nlm_GraphiC) b, &r);
  1058.   wptr = Nlm_ParentWindowPtr ((Nlm_GraphiC) b);
  1059. #ifdef WIN_MAC
  1060.   Nlm_RecTToRectTool (&r, &rtool);
  1061.   ref = (Nlm_Int4) b;
  1062.   c = NewControl (wptr, &rtool, (StringPtr) "", FALSE, 0, 0, 0, 16, ref);
  1063.   Nlm_LoadBarData (b, c, 0, 0, 0, 0, 0, FALSE, slv, actn);
  1064. #endif
  1065. #ifdef WIN_MSWIN
  1066.   if (vert) {
  1067.     style = SBS_VERT;
  1068.   } else {
  1069.     style = SBS_HORZ;
  1070.   }
  1071.   c = CreateWindow ("Scrollbar", "", WS_CHILD | style,
  1072.                     r.left, r.top, r.right - r.left,
  1073.                     r.bottom - r.top, wptr, 0,
  1074.                     Nlm_currentHInst, NULL);
  1075.   if (c != NULL) {
  1076.     SetProp (c, (LPSTR) "Nlm_VibrantProp", (Nlm_HandleTool) b);
  1077.   }
  1078.   Nlm_LoadBarData (b, c, 0, 0, 0, 0, 0, FALSE, slv, actn);
  1079.   if (lpfnNewBarProc == NULL) {
  1080.     lpfnNewBarProc = (WNDPROC) MakeProcInstance ((FARPROC) BarProc, Nlm_currentHInst);
  1081.   }
  1082.   if (lpfnOldBarProc == NULL) {
  1083.     lpfnOldBarProc = (WNDPROC) GetWindowLong (c, GWL_WNDPROC);
  1084.   } else if (lpfnOldBarProc != (WNDPROC) GetWindowLong (c, GWL_WNDPROC)) {
  1085.     Nlm_Message (MSG_ERROR, "BarProc subclass error");
  1086.   }
  1087.   SetWindowLong (c, GWL_WNDPROC, (LONG) lpfnNewBarProc);
  1088. #endif
  1089. #ifdef WIN_MOTIF
  1090.   n = 0;
  1091.   XtSetArg (wargs [n], XmNx, (Position) r.left); n++;
  1092.   XtSetArg (wargs [n], XmNy, (Position) r.top); n++;
  1093.   XtSetArg (wargs [n], XmNwidth, (Dimension) (r.right - r.left)); n++;
  1094.   XtSetArg (wargs [n], XmNheight, (Dimension) (r.bottom - r.top)); n++;
  1095.   XtSetArg (wargs [n], XmNmarginHeight, 0); n++;
  1096.   XtSetArg (wargs [n], XmNmarginWidth, 0); n++;
  1097.   XtSetArg (wargs [n], XmNborderWidth, (Dimension) 0); n++;
  1098.   XtSetArg (wargs [n], XmNminimum, 0); n++;
  1099.   XtSetArg (wargs [n], XmNmaximum, 20); n++;
  1100.   XtSetArg (wargs [n], XmNincrement, 1); n++;
  1101.   XtSetArg (wargs [n], XmNpageIncrement, 1); n++;
  1102.   XtSetArg (wargs [n], XmNvalue, 0); n++;
  1103.   XtSetArg (wargs [n], XmNsliderSize, 20); n++;
  1104.   if (vert) {
  1105.     XtSetArg (wargs [n], XmNorientation, XmVERTICAL); n++;
  1106.     XtSetArg (wargs [n], XmNprocessingDirection, XmMAX_ON_BOTTOM); n++;
  1107.   } else {
  1108.     XtSetArg (wargs [n], XmNorientation, XmHORIZONTAL); n++;
  1109.     XtSetArg (wargs [n], XmNprocessingDirection, XmMAX_ON_RIGHT); n++;
  1110.   }
  1111.   c = XmCreateScrollBar (wptr, (String) "", wargs, n);
  1112.   XtAddCallback (c, XmNincrementCallback, Nlm_LineDnCallback, (XtPointer) b);
  1113.   XtAddCallback (c, XmNdecrementCallback, Nlm_LineUpCallback, (XtPointer) b);
  1114.   XtAddCallback (c, XmNpageIncrementCallback, Nlm_PageDnCallback, (XtPointer) b);
  1115.   XtAddCallback (c, XmNpageDecrementCallback, Nlm_PageUpCallback, (XtPointer) b);
  1116.   XtAddCallback (c, XmNvalueChangedCallback, Nlm_ThumbCallback, (XtPointer) b);
  1117.   XtAddCallback (c, XmNtoTopCallback, Nlm_BottomCallback, (XtPointer) b);
  1118.   XtAddCallback (c, XmNtoBottomCallback, Nlm_TopCallback, (XtPointer) b);
  1119.   if (NLM_QUIET) {
  1120.     if (Nlm_WindowHasBeenShown (Nlm_ParentWindow (b))) {
  1121.       XtRealizeWidget (c);
  1122.     }
  1123.   } else {
  1124.     XtRealizeWidget (c);
  1125.   }
  1126.   Nlm_LoadBarData (b, c, 0, 0, 0, 0, 0, FALSE, slv, actn);
  1127. #endif
  1128. }
  1129.  
  1130. static Nlm_BaR Nlm_CommonScrollBar (Nlm_GraphiC slave, Nlm_RectPtr r,
  1131.                                     Nlm_ScrlProc actn, Nlm_Boolean vert)
  1132.  
  1133. {
  1134.   Nlm_BaR     b;
  1135.   Nlm_WindoW  tempPort;
  1136.  
  1137.   b = NULL;
  1138.   if (slave != NULL && r != NULL) {
  1139.     tempPort = Nlm_SavePort (slave);
  1140.     b = (Nlm_BaR) Nlm_HandNew (sizeof (Nlm_BarRec));
  1141.     if (b != NULL) {
  1142.       Nlm_LoadGraphicData ((Nlm_GraphiC) b, NULL, (Nlm_GraphiC) slave,
  1143.                            NULL, NULL, barProcs, NULL, r, TRUE, FALSE);
  1144.       if (Nlm_nextIdNumber < 32767) {
  1145.         Nlm_nextIdNumber++;
  1146.       }
  1147.       Nlm_NewBar (b, slave, vert, actn);
  1148.     }
  1149.     Nlm_RestorePort (tempPort);
  1150.   }
  1151.   return b;
  1152. }
  1153.  
  1154. extern Nlm_BaR Nlm_HorizScrollBar (Nlm_GraphiC slave, Nlm_RectPtr r, Nlm_ScrlProc actn)
  1155.  
  1156. {
  1157.   return (Nlm_CommonScrollBar (slave, r, actn, FALSE));
  1158. }
  1159.  
  1160. extern Nlm_BaR Nlm_VertScrollBar (Nlm_GraphiC slave, Nlm_RectPtr r, Nlm_ScrlProc actn)
  1161.  
  1162. {
  1163.   return (Nlm_CommonScrollBar (slave, r, actn, TRUE));
  1164. }
  1165.  
  1166. extern Nlm_BaR Nlm_ScrollBar (Nlm_GrouP prnt, Nlm_Int2 width,
  1167.                               Nlm_Int2 height, Nlm_BarScrlProc actn)
  1168.  
  1169. {
  1170.   Nlm_BaR      b;
  1171.   Nlm_Int2     bhgt;
  1172.   Nlm_Int2     bwid;
  1173.   Nlm_PoinT    npt;
  1174.   Nlm_RecT     r;
  1175.   Nlm_WindoW   tempPort;
  1176.   Nlm_Boolean  vert;
  1177.  
  1178.   b = NULL;
  1179.   if (prnt != NULL) {
  1180.     tempPort = Nlm_SavePort ((Nlm_GraphiC) prnt);
  1181.     Nlm_GetNextPosition ((Nlm_GraphiC) prnt, &npt);
  1182.     if (width > 0) {
  1183.       vert = FALSE;
  1184.       bwid = width * Nlm_stdCharWidth;
  1185.       Nlm_LoadRect (&r, npt.x, npt.y, npt.x+bwid, npt.y+Nlm_hScrollBarHeight);
  1186.     } else {
  1187.       vert = TRUE;
  1188.       bhgt = height * Nlm_stdLineHeight;
  1189.       Nlm_LoadRect (&r, npt.x, npt.y, npt.x+Nlm_vScrollBarWidth, npt.y+bhgt);
  1190.     }
  1191.     b = (Nlm_BaR) Nlm_CreateLink ((Nlm_GraphiC) prnt, &r, sizeof (Nlm_BarRec), linkedBarProcs);
  1192.     if (b != NULL) {
  1193.       Nlm_NewBar (b, (Nlm_GraphiC) prnt, vert, (Nlm_ScrlProc) actn);
  1194.       Nlm_DoAdjustPrnt ((Nlm_GraphiC) b, &r, TRUE, FALSE);
  1195.       Nlm_DoShow ((Nlm_GraphiC) b, TRUE, FALSE);
  1196.     }
  1197.     Nlm_RestorePort (tempPort);
  1198.   }
  1199.   return b;
  1200. }
  1201.  
  1202. extern void Nlm_CorrectBarValue (Nlm_BaR b, Nlm_Int2 val)
  1203.  
  1204. {
  1205.   Nlm_BarData  bdata;
  1206.   Nlm_BarTool  c;
  1207.   Nlm_Int2     oldval;
  1208.   Nlm_WindoW   tempPort;
  1209. #ifdef WIN_MOTIF
  1210.   Nlm_Int2     page;
  1211. #endif
  1212.  
  1213.   if (b != NULL) {
  1214.     Nlm_GetBarData (b, &bdata);
  1215.     if (val < 0) {
  1216.       val = 0;
  1217.     }
  1218.     if (val > bdata.maximum) {
  1219.       val = bdata.maximum;
  1220.     }
  1221.     c = bdata.handle;
  1222.     oldval = bdata.value;
  1223.     bdata.value = val;
  1224.     bdata.delta = oldval - val;
  1225.     Nlm_SetBarData (b, &bdata);
  1226.     if (val != oldval && Nlm_GetEnabled ((Nlm_GraphiC) b)) {
  1227.       tempPort = Nlm_SavePortIfNeeded ((Nlm_GraphiC) b, TRUE);
  1228. #ifdef WIN_MAC
  1229.       SetCtlValue (c, val);
  1230. #endif
  1231. #ifdef WIN_MSWIN
  1232.       SetScrollPos (c, SB_CTL, val, TRUE);
  1233. #endif
  1234. #ifdef WIN_MOTIF
  1235.       page = (bdata.pageUp + bdata.pageDn) / 2;
  1236.       XmScrollBarSetValues (c, (int) val, 20, 1, (int) page, FALSE);
  1237. #endif
  1238.       Nlm_RestorePort (tempPort);
  1239.     }
  1240.   }
  1241. }
  1242.  
  1243. extern void Nlm_CorrectBarMax (Nlm_BaR b, Nlm_Int2 max)
  1244.  
  1245. {
  1246.   Nlm_BarData  bdata;
  1247.   Nlm_BarTool  c;
  1248.   Nlm_Int2     oldmax;
  1249.   Nlm_WindoW   tempPort;
  1250. #ifdef WIN_MOTIF
  1251.   Cardinal     n;
  1252.   Arg          wargs [10];
  1253. #endif
  1254.  
  1255.   if (b != NULL) {
  1256.     Nlm_GetBarData (b, &bdata);
  1257.     oldmax = bdata.maximum;
  1258.     bdata.maximum = max;
  1259.     Nlm_SetBarData (b, &bdata);
  1260.     if (max != oldmax && Nlm_GetEnabled ((Nlm_GraphiC) b)) {
  1261.       tempPort = Nlm_SavePortIfNeeded ((Nlm_GraphiC) b, TRUE);
  1262.       c = bdata.handle;
  1263. #ifdef WIN_MAC
  1264.       SetCtlMax (c, max);
  1265. #endif
  1266. #ifdef WIN_MSWIN
  1267.       SetScrollRange (c, SB_CTL, 0, max, TRUE);
  1268. #endif
  1269. #ifdef WIN_MOTIF
  1270.       n = 0;
  1271.       XtSetArg (wargs [n], XmNminimum, 0); n++;
  1272.       XtSetArg (wargs [n], XmNmaximum, (int) max + 20); n++;
  1273.       XtSetValues (c, wargs, n);
  1274. #endif
  1275.       Nlm_RestorePort (tempPort);
  1276.     }
  1277.   }
  1278. }
  1279.  
  1280. extern void Nlm_CorrectBarPage (Nlm_BaR b, Nlm_Int2 pgUp, Nlm_Int2 pgDn)
  1281.  
  1282. {
  1283.   Nlm_BarData  bdata;
  1284.  
  1285.   if (b != NULL) {
  1286.     Nlm_GetBarData (b, &bdata);
  1287.     bdata.pageUp = pgUp;
  1288.     bdata.pageDn = pgDn;
  1289.     Nlm_SetBarData (b, &bdata);
  1290.   }
  1291. }
  1292.  
  1293. extern void Nlm_SetBarAnomaly (Nlm_BaR b, Nlm_Boolean anomaly)
  1294.  
  1295. {
  1296.   Nlm_BarData  bdata;
  1297.  
  1298.   if (b != NULL) {
  1299.     Nlm_GetBarData (b, &bdata);
  1300.     bdata.anomaly = anomaly;
  1301.     Nlm_SetBarData (b, &bdata);
  1302.   }
  1303. }
  1304.  
  1305. extern void Nlm_FreeBars (void)
  1306.  
  1307. {
  1308.   gphprcsptr = (Nlm_GphPrcsPtr) Nlm_MemFree (gphprcsptr);
  1309. }
  1310.  
  1311. extern void Nlm_InitBars (void)
  1312.  
  1313. {
  1314.   gphprcsptr = (Nlm_GphPrcsPtr) Nlm_MemNew (sizeof (Nlm_GphPrcs) * 2);
  1315.  
  1316.   barProcs = &(gphprcsptr [0]);
  1317. #ifdef WIN_MAC
  1318.   barProcs->click = Nlm_ScrollClick;
  1319.   barProcs->draw = Nlm_DrawBar;
  1320. #endif
  1321. #ifdef WIN_MSWIN
  1322.   barProcs->command = Nlm_ScrollCommand;
  1323. #endif
  1324. #ifdef WIN_MOTIF
  1325. #endif
  1326.   barProcs->show = Nlm_ShowBar;
  1327.   barProcs->hide = Nlm_HideBar;
  1328.   barProcs->enable = Nlm_EnableBar;
  1329.   barProcs->disable = Nlm_DisableBar;
  1330.   barProcs->remove = Nlm_RemoveBar;
  1331.   barProcs->reset = Nlm_ResetBar;
  1332.   barProcs->setValue = Nlm_SetBarValue;
  1333.   barProcs->getValue = Nlm_GetBarValue;
  1334.   barProcs->setPosition = Nlm_SetBarPosition;
  1335.   barProcs->getPosition = Nlm_GetBarPosition;
  1336.   barProcs->setRange = Nlm_SetBarRange;
  1337.  
  1338.   linkedBarProcs = &(gphprcsptr [1]);
  1339. #ifdef WIN_MAC
  1340.   linkedBarProcs->click = Nlm_ScrollClick;
  1341.   linkedBarProcs->draw = Nlm_DrawBar;
  1342. #endif
  1343. #ifdef WIN_MSWIN
  1344.   linkedBarProcs->command = Nlm_ScrollCommand;
  1345. #endif
  1346. #ifdef WIN_MOTIF
  1347. #endif
  1348.   linkedBarProcs->show = Nlm_ShowBar;
  1349.   linkedBarProcs->hide = Nlm_HideBar;
  1350.   linkedBarProcs->enable = Nlm_EnableBar;
  1351.   linkedBarProcs->disable = Nlm_DisableBar;
  1352.   linkedBarProcs->remove = Nlm_RemoveLinkedInBar;
  1353.   linkedBarProcs->reset = Nlm_ResetBar;
  1354.   linkedBarProcs->setValue = Nlm_SetBarValue;
  1355.   linkedBarProcs->getValue = Nlm_GetBarValue;
  1356.   linkedBarProcs->setPosition = Nlm_SetBarPosition;
  1357.   linkedBarProcs->getPosition = Nlm_GetBarPosition;
  1358.   linkedBarProcs->setRange = Nlm_SetBarRange;
  1359. }
  1360.